/**************************************************************************//**
 * @item     CosyOS Kernel
 * @file     sv_int_loc.h
 * @brief    中断同步服务（仅在用户中断中调用，并在本地执行）
 * @author   迟凯峰
 * @version  V3.3.0
 * @date     2023.07.15
 ******************************************************************************/

#ifndef __SV_INT_LOC_H
#define __SV_INT_LOC_H

extern tFetion __recv_fetion__(tFetion _XDATA_MEM_ *tbox);
#if SYSCFG_MCUCORE == 8051
extern bool  __recv_mail1__(void _XDATA_MEM_ *gm);
extern bool  __recv_mail2__(void);
extern void *__recv_mail3__(void);
extern bool  __recv_msg1__ (tspMsgQueue msg_queue);
extern void *__recv_msg2__ (tspMsgQueue msg_queue);
#define      __read_gvar__(gp)	\
(	\
	os_sign_write_var_write || vVarNode == NULL || vVarNode->gvar != (void *)gp ? gp : vVarNode->lvar	\
)
#else
extern bool  __recv_mail0__(void *lm, void *gm, size_t size, bool *gf) __251_REENTRANT__;
extern void *__recv_msg0__ (tspMsgQueue msg_queue);
extern void *__read_gvar__ (void *gp);
#endif



/*
 * 二值信号量
 */

/* 获取 */
#define sISV_TakeBin(bin)	\
(	\
	bin ? bin-- : bin	\
)



/*
 * 飞信
 */

/* 接收飞信 */
#define sISV_RecvFetion(tbox)	\
(	\
	tbox ? __recv_fetion__(&tbox) : false	\
)



/*
 * 消息邮箱
 */

/* 接收邮件 */
#if SYSCFG_MCUCORE == 8051
#if SYSCFG_INTRECVMAIL == 0
#define sISV_RecvMail(mail, mbox)	\
(	\
	__recv_mail1__(&mbox)	\
	? mbox##_gnmf	\
		? __memcpy(mail, &mbox, sizeof(mbox)) || true	\
			? mbox##_gnmf--	\
			: mbox##_gnmf--	\
		: false	\
	: false	\
)
#elif SYSCFG_INTRECVMAIL == 1
#define sISV_RecvMail(mail, mbox)	\
(	\
	__recv_mail1__(&mbox)	\
	? mbox##_gnmf	\
		? __memcpy(mail, &mbox, sizeof(mbox)) || true	\
			? mbox##_gnmf--	\
			: mbox##_gnmf--	\
		: false	\
	: __recv_mail2__()	\
		? __memcpy(mail, __recv_mail3__(), sizeof(mbox)) || true	\
			? true	\
			: true	\
		: false	\
)
#endif
#else
#define sISV_RecvMail(mail, mbox)	\
	__recv_mail0__(mail, &mbox, sizeof(mbox), &mbox##_gnmf)
#endif



/*
 * 消息队列
 */

/* 接收消息 */
#if SYSCFG_MCUCORE == 8051
#define	sISV_RecvMsg(que)	\
(	\
	__recv_msg1__(que) ? __recv_msg2__(que) : NULL	\
)
#else
#define	sISV_RecvMsg(que)	\
	__recv_msg0__(que)
#endif



/*
 * 事件标志组
 */

 /* 查询标志组 */
#define	sISV_QueryFlagGroup(group)	\
(	\
	  sizeof(group) == 1 ? *(u8  *)&group ? true : false	\
	: sizeof(group) == 2 ? *(u16 *)&group ? true : false	\
	: sizeof(group) == 4 ? *(u32 *)&group ? true : false	\
	: false	\
)



/*
 * 全局变量
 */

/* 读全局变量 */
#define sISV_ReadGVar(gv, type)	\
	*(type *)__read_gvar__(&gv)	\

/* 读全局数组 */
#define sISV_ReadGAry(lp, gp, size)	\
	__memcpy(lp, __read_gvar__(gp), size)	\

/* 读全局字符串 */
#define sISV_ReadGStr(ls, gs)	\
	__strcpy(ls, (char *)__read_gvar__(gs))	\



#endif
